注意:所有文章除特别说明外,转载请注明出处.
第13章 Spring框架的设计理念与设计模式分析
[TOC]
13.1 Spring的骨骼架构
Spring的核心组件只有三种:Core | Context | Bean。其构建起整个Spring骨骼架构,没有它们就不可能有AOP | Web等上层的特性功能。
13.1.1 Spring的设计理念
Spring解决非常关键的问题,它可以让我们将对象之间的依赖关系转而用配置文件来管理,也就是依赖注入机制。而这个注入关系由Ioc容器中管理。
我们知道Bean包装的是Object,而Object必然有数据,而Context要解决的是数据的生存问题,发现每个Bean之间的关系。所以Context是一个Bean关系的集合,这个关系集合又叫Ioc容器。Core就是发现、建立和维护每个Bean之间的关系所需要的一些列工具。
13.2 核心组件
13.2.1 Bean组件
Spring Bean的创建是典型的工厂模式,它的顶级接口是BeanFactory。BeanFactory有三个子类:1. ListableFactory 2. HierarchicalBeanFactory 3. AutowireCapacleBeanFactory。但最终的默认实现类都是 DefaultListableBeanFactory。
定义这么多接口的原因是因为每个接口都有其使用的场合,其主要区分在Spring对象内部对象的转换和传递过程,将对象的数据访问做限制。
1. ListableBeanFactory 表示Bean是可列表的
2. HierarchicalBeanFactory 表示这些Bean是有继承关系的
3. Autowire.. 表示Bean的自动装配规则
Bean的定义主要有BeanDefinition描述。Bean的完整描述了在Spring配置文件中定义
提示:Bean的解析过程就是对Spring配置文件的解析。
13.2.2 Context组件
Context在Spring的 org.springframework.context 包下面。ApplicationContext是Context的顶级父类,它除了标识一个应用环境的基本信息之外,还继承了5个接口。
ApplicationContext继承了BeanFactory,说明了Spring容器中运行的主体对象是Bean。另外ApplicationContext继承了ResourceFactory接口,可以访问任何外部资源。
ApplicationContext的子类包含两个方面:
1. ConfigurableApplicationContext 表示该Context可修改,在构建Context用户可以动态添加和修改已有的配置信息,其下面有多个子类,最常使用可更新的Context(AbstractRefreshableApplicationContext类)。
2. WebApplicationContext 表示为Web准备的Context,可以直接访问到ServletContext。
总体来说Context必须完成以下几件事情:
1. 标识一个应用环境
2. 利用BeanFactory创建Bean对象
3. 保存对象关系表
4. 能够捕获各种事件
12.2.3 Core组件
Core组件是Spring的核心组件,包含了很多关键类,一个重要的组成部分是定义了资源的访问方式。
12.2.4 Ioc容器工作过程
1. 创建BeanFacoty工厂
Ioc容器实际上是Context组件结合其它两个组件共同构建了一个Bean关系网。
4. Ioc容器
我们如果需要使用Spring必须要先构建Ioc容器,没有它Spring无法工作,ApplicationContext.xml就是Ioc容器默认配置文件,Spring的所有特性功能都是基于Ioc容器工作的。
13.3 Spring中AOP
13.3.1 动态代理
AOP是基于动态代理实现的。在JDK的java.lang.reflect包下有个Proxy类,是构造代理类的入口。最后一个方法newproxyInstance是创建代理对象的方法。
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h);
1. ClassLoader 用于加载代理类的Loader类,通常这个Loader类和被代理的类是同一个Loader类。
2. interfaces 被代理的那些接口
3. InvocationHandler 用于执行除了被代理类接口中方法之外的用户定义的操作,是用户需要代理的最终目的。用户调用目标方法都被代理到InvocationHandler类中定义的唯一方法invoke()中。
13.3.2 Spring AOP的实现
代理的目的是调用目标方法时可以转而执行InvocationHandler类的invoke()方法,所以如何在InvocationHandler类上做文章便是实现AOP的关键所在。
Spring如何完成代理:
1. 代理类继承了FactoryBean的ProxyFactoryBean,FactoryBeab之所以特别就在于它可以让我们自定义对象的创建方法。
2. Spring在创建代理对象之后,在我们调用目标对象上的方法时,都会被代理到InvocationHandler类的invok()方法中执行。
13.4 设计模式之代理模式
13.4.1 代理模式原理
代理模式就是给某一个对象创建一个代理对象,由这个代理对象控制对原对象的引用,而创建此代理对象后可以在调用原对象时增加一些额外的操作。
1. Subject 抽象主题,它是代理对象的真实对象要实现的接口
2. ProxySubject 代理类,除了实现抽象主题定义的接口外,还必须持有所代理对象的引用
3. RealSubject 被代理的类,是目标对象
13.5 设计模式之策略模式
13.5.1 策略模式原理
表示完成某个操作可能有多种方法,这些方法都可能被使用到,每个实现方法都当做一个实现策略,用户可以根据场景选择合适的策略。
1. Context 不同策略的环境,可根据自身条件选择不同的策略实现类完成所要的操作。
2. Strategy 抽象策略,定义每个策略都要实现的策略方法
3. ConcreteStrategy 具体策略实现类,实现抽象策略中定义的策略方法
13.5.2 Spring中策略模式的实现
Spring中有多个地方用到了策略模式。如:Bean定义对象的创建及代理对象的创建等。